/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.cratos.xxgram.platf.message;

import com.cratos.xxgram.platf.base.BaseEntity;

import java.util.List;

import javax.persistence.Column;
import org.redkale.util.Comment;

/**
 *  消息的分类
 *  内容类消息	表示一个用户间发送的包含具体内容的消息，需要展现在聊天界面上，如文字消息、语音消息等。
 *  通知类消息	表示一个通知信息，可能展现在聊天界面上，如提示条通知。
 *  状态类消息	表示一个状态，用来实现如“对方正在输入”的功能。
 *  信令类消息	融云在实现 SDK 自身业务功能时使用的，开发者不需要对其做任何处理。
 *  https://docs.rongcloud.cn/im/introduction/message_structure/#_5
 * @author SquRab
 */
public abstract class BaseContent extends BaseEntity {
   
	public BaseContent() {
    }
    public Object getExtra() {
        return extra;
    }
    public void setExtra(Object extra) {
        this.extra = extra;
    }
    @Comment("扩展信息，可以放置任意的数据内容，也可以去掉此属性。")
    @Column(comment = "extra")
    protected Object extra;// 扩展信息
    
    @Comment("@某人相关参数")
    protected MentionedInfo mentionedInfo;
    
    public void attach(Object extra) {
        this.extra = extra;
    }
    
    public MentionedInfo getMentionedInfo() {
		return mentionedInfo;
	}
	public void setMentionedInfo(MentionedInfo mentionedInfo) {
		this.mentionedInfo = mentionedInfo;
	}


	@Comment("@某人相关参数")
    public static class MentionedInfo {
    	
		public static final short ALL = 1;
		
		public static final short PART = 2;
		
    	@Comment("@ 功能类型，1 表示 @ 所有人、2 表示 @ 指定用户。（必传")
    	private short type;
    	
    	@Comment("指定用户列表，type 为 2 时有效，为 1 时 userIdList 可以为空。（非必传）")
    	private List<Integer> userIds;
    	
    	@Comment("@ 消息的自定义 Push 内容。（非必传）")
    	private String mentionedContent;

		public short getType() {
			return type;
		}

		public void setType(short type) {
			this.type = type;
		}

		public List<Integer> getUserIds() {
			return userIds;
		}

		public void setUserIds(List<Integer> userIds) {
			this.userIds = userIds;
		}

		public String getMentionedContent() {
			return mentionedContent;
		}

		public void setMentionedContent(String mentionedContent) {
			this.mentionedContent = mentionedContent;
		}
		
    	/**
    	 * @ 相关参数
    	 * @param userIds
    	 * @param type
    	 * @return
    	 */
		public static MentionedInfo from(List<Integer> userIds, short type) {
			MentionedInfo info = new MentionedInfo();
			info.setType(type);
			info.setUserIds(userIds);
			return info;
		}
    }
}
